package com.cong.security.core.social.qq.connect;

import java.nio.charset.Charset;

import org.apache.commons.lang3.StringUtils;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.social.oauth2.AccessGrant;
import org.springframework.social.oauth2.OAuth2Template;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class QQOAuth2Template extends OAuth2Template {

    public QQOAuth2Template(String clientId, String clientSecret, String authorizeUrl, String accessTokenUrl) {
        // clientId和clientSecret对应APP的appId以及appSecret
        super(clientId, clientSecret, authorizeUrl, accessTokenUrl);
        // 默认是false，必须设置为true才会设置clientId以及clientSecret
        setUseParametersForClientAuthentication(true);
    }

    /**
     * AccessGrant---访问令牌信息的封装
     */
    @Override
    protected AccessGrant postForAccessGrant(String accessTokenUrl, MultiValueMap<String, String> parameters) {
        // 返回的不是json数据，返回的是字符串，需要对字符串切割，截取数据
        String responseStr = getRestTemplate().postForObject(accessTokenUrl, parameters, String.class);
        log.info("获取accessToken的响应：[{}]", responseStr);
        String[] items = StringUtils.splitByWholeSeparatorPreserveAllTokens(responseStr, "&");
        // 令牌
        String accessToken = StringUtils.substringAfterLast(items[0], "=");
        // 过期时间
        Long expiresIn = new Long(StringUtils.substringAfterLast(items[1], "="));
        // 刷新令牌
        String refreshToken = StringUtils.substringAfterLast(items[2], "=");
        return new AccessGrant(accessToken, null, refreshToken, expiresIn);
    }

    @Override
    protected RestTemplate createRestTemplate() {
        // 拿到父类的创建结果，此时父类的三种转换器已经添加完成已经完成
        RestTemplate restTemplate = super.createRestTemplate();
        // 添加新的转换器，处理text/html类型
        restTemplate.getMessageConverters().add(new StringHttpMessageConverter(Charset.forName("UTF-8")));
        return restTemplate;
    }
}
